/* 
 * PageNavigator.java      1.00    2008-04-18 
 *
 * Copyright (c) 2010 frida. All Rights Reserved.
 * 
 * This software is the confidential and proprietary information
 * of frida.  You shall not disclose such Confidential Information
 * and shall use it only in accordance with the terms of the license agreement
 * you entered into with frida.
 */
package doit.framework.util;

import javax.servlet.http.HttpServletRequest;

/**
 * <pre>
 * system      : 공통
 * menu        : 공통
 * source      : PageNavigator.java
 * description : 페이지 네비게이션 관리
 * </pre> 
 * @version
 * <pre> 
 * 1.0	2008-04-18  frida  최초 작성
 * 1.1	
 * </pre>
 */

public class PageNavigator {
	
	private HttpServletRequest request;
	private String script;
	private String pageIndexes;
	private String pageTextInput;
	private String rowsPerPageSelector;
	private String pagesPerIndexSelector;
	private String hiddenInput;
	private String orderBy;
	private String totalRows;
	private long rows;
	private long pages;
	private long indexes;
	private String field;
	
	public static final int EXP_TOTAL_ROWS = 1;
	public static final int EXP_PAGE_INPUT = 2;
	public static final int EXP_ROWS_PER_PAGE_SELECTOR = 4;
	
	private long page;
	private long index;
	private long firstRowOfPage;
	private long firstPageOfIndex;

	private int rowsPerPage;
	private int pagesPerIndex;
	
	private String location;
	private String method = "pageList";


	public PageNavigator() {		
		this.rowsPerPage = PageUtils.ROWS_PER_PAGE_DEFAULT;
		this.pagesPerIndex = PageUtils.PAGES_PER_INDEX_DEFAULT;
	}
	
	public PageNavigator( HttpServletRequest request, String currPage, String rows, String rowsPerPage, String pagesPerIndex, String orderBy, String location, String method ) {
		this( currPage, rows, rowsPerPage, pagesPerIndex);
		this.request = request;
		this.location = location;
		if (method != null && !method.equals(""))
			this.method = method;
		this.orderBy = SharedMethods.nullCheck( orderBy);
	}
	/**
	 * 페이징에 필요한 값들을 설정한다.
	 * @param page int 현재 보여지는 페이지 위치
	 * @param rows int 페이지 상의 Row 수
	 * @param rowsPerPage int 한 페이지당 보여지는 Row 수
	 * @param rowsPerPage int 한 Index당 보여지는 Page 수
	 */
	public PageNavigator( String currPage, String rows, String rowsPerPage, String pagesPerIndex ) {
		this( currPage, rows, rowsPerPage);
		
		this.pagesPerIndex = Integer.parseInt( SharedMethods.nullCheck( pagesPerIndex, PageUtils.PAGES_PER_INDEX_DEFAULT));
	}
	public PageNavigator( String currPage, String rows, String rowsPerPage ) {
		this( currPage, rows);
		
		this.rowsPerPage = Integer.parseInt( SharedMethods.nullCheck( rowsPerPage, PageUtils.ROWS_PER_PAGE_DEFAULT));
	}
	public PageNavigator( String currPage, String rows ) {		
		this.rows = Integer.parseInt( SharedMethods.nullCheck( rows, 0));
		this.page = Integer.parseInt( SharedMethods.nullCheck( currPage, 1));
	}

	public void calculate()
	{
		if( this.rows > 0) {			
			this.firstRowOfPage = PageUtils.getFirstRowOfPage( this.page, this.rowsPerPage);
			this.firstPageOfIndex = PageUtils.getFirstPageOfIndex( this.page, this.pagesPerIndex);
			this.pages = PageUtils.getPageOfRow( this.rows, getRowsPerPage());
		}

		if( this.page < 1) this.page = 1;
		if( this.pages < 1) this.pages = 1;
		if( this.page > this.pages) this.page = this.pages;

		this.indexes = PageUtils.getIndexOfPage( this.pages, pagesPerIndex);
	}
	
	public PageNavigator generatePageBean()
	{
		calculate();
		
		this.script = PageUtils.generateScript(this.location, this.method);

		this.pageIndexes = PageUtils.generatePageIndexes( this.request, getPage(), getPages(), getPagesPerIndex());
		this.totalRows = PageUtils.generateExpTotalRows( getRows());
		this.pageTextInput = PageUtils.generatePageTextInput( this.request, getPage(), getPages(), getPagesPerIndex());
		this.rowsPerPageSelector = PageUtils.generateRowsPerPageSelector( getRowsPerPage());
		this.pagesPerIndexSelector = PageUtils.generatePagesPerIndexSelector( getPagesPerIndex());
		this.hiddenInput = PageUtils.generateInput( getPage(), orderBy, getRowsPerPage(), getPagesPerIndex());
		
		return this;
	}

	/**
	 * 페이지 상에서 현재 Index 위치값을 리턴한다
	 * @return int 현재 보여지는 페이지의 Index 위치
	 */
	public final long getIndex() {
		return index;
	}
	/**
	 * 페이지 상에 현재 Page 위치값을 리턴한다
	 * @return int 현재 보여지는 페이지의 Page 위치
	 */
	public final long getPage() {
		return page;
	}

	/**
	 * 페이지 상에 현재 Page의 첫번째 row 값을 리턴한다
	 * @return int 현재 보여지는 페이지의 Page 의 첫번째 row
	 */
	public final long getFirstRowOfPage() {
		return firstRowOfPage;
	}

	/**
	 * 페이지 상에 현재 Page index 의 첫번째 page 값을 리턴한다
	 * @return int 현재 보여지는 페이지의 Page index 의 첫번째 index
	 */
	public final long getFirstPageOfIndex() {
		return firstPageOfIndex;
	}

	/**
	 * 페이지에 사용되는 Index의 총 갯수를 리턴한다. 
	 * @return int Index의 총 갯수
	 */
	public final long getIndexes() {
		return indexes;
	}
	/**
	 * 하나의 인덱스를 구성하는데 필요한 Page 수를 리턴한다. 
	 * @return int 한 인덱스에 보여지는 Page수 
	 */
	public final int getPagesPerIndex() {
		return pagesPerIndex;
	}
	/**
	 * 하나의 페이지를 구성하는데 필요한 Row의 수를 리턴한다.
	 * @return int 한 페이지에 보여지는 Row수
	 */
	public final int getRowsPerPage() {
		return rowsPerPage;
	}
	/**
	 * 페이지에 사용되는 Page 총 갯수를 리턴한다.
	 * @return int Page의 총 갯수
	 */
	public final long getPages() {
		return pages;
	}
	/**
	 * 페이지에 사용되는 Row의 총 갯수를 리턴한다.
	 * @return int Row의 총 갯수
	 */
	public final long getRows() {
		return rows;
	}
	
	public final String getTotalRows() {
		return totalRows;
	}
	
	public final String getScript() {
		return script;
	}
	
	public final String getHiddenInput() {
		return hiddenInput;
	}
	
	public final String getPageIndexes() {
		return pageIndexes;
	}
	
	public final String getPageTextInput() {
		return pageTextInput;
	}
	
	public final String getRowsPerPageSelector() {
		return rowsPerPageSelector;
	}
	
	public final String getPagesPerIndexSelector() {
		return pagesPerIndexSelector;
	}
	
	public final String getOrderBy() {
		return orderBy;
	}
	
	public final void setField(String field) {
		this.field = field;
	}
	
	public final String getSortField() {
		if( this.field != null && field.indexOf(":") > 0)			
			return PageUtils.showSortField( this.request, field.split( ":")[0], field.split( ":")[1], getOrderBy());
		else 
			return field;
	}
	
}
